<?php

class Application_Model_Eventos extends Zend_Db_Table_Abstract
{

    protected $_name = 'eventos';
    protected $_primary = 'evId';
    protected $_rowClass = 'Application_Model_Evento';
    protected $_dependentTables = array('Application_Model_EventoCategory', 'Application_Model_Iscriziones', 'Application_Model_Fotos');
    protected $_referenceMap = array(
        'Guidas' => array(
            'columns' => array('guida_guidaId'),
            'refTableClass' => 'Application_Model_Guidas',
            'refColumns' => array('guidaId')
        ),
        'Difficoltas' => array(
            'columns' => array('difficolta_diffId'),
            'refTableClass' => 'Application_Model_Difficoltas',
            'refColumns' => array('diffId')
        ),
    );

    /**
     * Get All Eventos with paginator
     * 
     * @param int $paged
     * @param string $order
     * @return \Zend_Paginator | Zend_Db8table_Rowset
     */
    public function getAllEventos($paged = NULL, $order = NULL)
    {
        $select = $this->select();
        if (NULL != $order) {
            $select->order($order);
        }
        
        if (NULL != $paged) {
            $adapter = new Zend_Paginator_Adapter_DbTableSelect($select);
            
            $count = $this->getNumEventi();
            $adapter->setRowCount($count);
            
            $paginator = new Zend_Paginator($adapter);
            $paginator->setItemCountPerPage(10)
                      ->setCurrentPageNumber((int) $paged);
              return $paginator;
        }
        
        return $this->fetchAll($select);
    }
    
    /** 
     * Get an eventos array by category Id 
     * @param int $catID
     * @return array Application_Model_Evento
     */
    public function getEventosByCategoryId($catId)
    {
        $select = $this->select()
                       ->setIntegrityCheck(FALSE)
                       ->join('eventoCategory', 'eventoCategory.evento_evId = eventos.evId')
                       ->where('eventoCategory.category_catId = ?', $catId);
        $evCat = $this->fetchAll($select); //Rowset di eventoCategory
        
        $eventi = array();
        foreach ($evCat as $eC) {
            $eventi[] = $this->getEventoById($eC->evento_evId);
        }
        return $eventi; //array di row di evento
    }

    /**
     * Get the actual eventos
     * 
     * @return Zend_Db_Table_Rowset 
     */
    public function getEventosActuals()
    {
        $date = new Zend_Date();
        $now = $date->now()->toString('y-M-d H:i:s');
        $select = $this->select()
                       ->where('evDataInizio > ?', $now)
                       ->order('evDataInizio ASC');
        return $this->fetchAll($select);
    }
    
    
//     /**
//     * Get eventos by category Id 
//     *
//     * @param int $catId
//     * @return Zend_Db_Table_Rowset
//     */
//    public function getEventosByCategoryId($catId)
//    {
//        $categorys = new Application_Model_Categorys();
//        $cat = $categorys->getCategoryById($catId);
//        
//        // Cerca gli eventi che si riferiscono alla riga $cat Via la tabella 
//        // eventoCategory utilizzando la relazione Categorys. 
//        // Utilizza i metodi magici.
//        $eventos = $cat->findApplication_Model_EventosViaApplication_Model_EventoCategoryByCategorys();
//        
//        return $eventos;
//    }
    
//    /** ALTERNATIVA FUNZIONANTE
//     * Get an eventos + category array by category Id 
//     *
//     * @param int $catId
//     * @return mixt array
//     */
//    public function getEventosByCategoryId($catId)
//    {
//        $categorys = new Application_Model_Categorys;
//        $eventoCategory = new Application_Model_EventoCategory;
//        
//        $cat = $categorys->find($catId)->current();
//        $eventos = $cat->findManyToManyRowset($this, $eventoCategory);
//        $risultato = array(
//            'cat' => $cat,
//            'eventos' => $eventos,
//        );
//        return $risultato;
//    }

    
    /**
     *
     * @return Application_Model_Evento 
     */
    public function getPrimoEvento()
    {
        //$select = $this->select();
        return $this->fetchRow();
    }
    
    /**
     *
     * @param int $id
     * @return Application_Model_Evento 
     */
    public function getEventoById($id)
    {
        return $this->find($id)->current();
    }
    
    /**
     *
     * @param string $ident
     * @return Zend_Db_Table_Row_Abstract 
     */
    public function getEventoByIdent($ident)
    {
        $select = $this->select()
                       ->where('evIdent = ?', $ident);
        return $this->fetchRow($select);
    }

        /**
     * Restituisce il numero totale degli eventi
     * @return int 
     */
    public function getNumEventi()
    {
        $eventi = $this->fetchAll();
        $numEventi = $eventi->count();
        return $numEventi;
    }
    
    /**
     * Ultimo evento inserito
     * @return Application_Model_Evento
     */
    public function getUltimoEvento()
    {
        return $this->getEventoById($this->getNumEventi());
    }
    
    /**
     * Ritorna un array pulito dei titoli, per il motore di ricerca.
     * 
     * @return array of titles
     */
    public function getAllTitles()
    {
        $select = $this->select()
                       ->from('eventos', 'evTitolo');
        $titles = $this->fetchAll($select)->toArray();
        $titoli = array();
        foreach ($titles as $titolo) {
            $titoli[] = $titolo['evTitolo'];
        }
        
        return $titoli;  
    }
    /**
     * Create evento row
     * 
     * @param string $titolo
     * @param string $dataInizio
     * @param string $dataFine
     * @param string $dataRimandato
     * @param string $dataTermine
     * @param string $intro
     * @param string $corpo
     * @param string $logistica
     * @param string $abbigliamento
     * @param string $costo
     * @param string $info
     * @param string $video
     * @param int $catId 
     * @param int $guidaId
     * @param int $difficoltaId 
     */
    public function createEvento($titolo, $dataInizio, $dataFine, $dataTermine,
            $intro, $corpo, $guidaId, $difficoltaId,
            $dataRimandato = null, $logistica = null, $abbigliamento = null, 
            $costo = null, $info = null, $video = null)
    {
        //***Trim $titolo***
        $filterTrim = new Zend_Filter_StringTrim();
        $titoloTrimmed = $filterTrim->filter($titolo);
        // toLower $titolo
        $filterToLower = new Zend_Filter_StringToLower();
        $titoloMinuscolo = $filterToLower->filter($titoloTrimmed);
        // spaceToDash $titolo
        $filterSpaceToDash = new Zend_Filter_PregReplace(array(
                                            'match' => '/ /',
                                            'replace' => '-'
                                ));
        $ident = $filterSpaceToDash->filter($titoloMinuscolo);
        //***Fine Trim $titolo***
        
        // Create a new row
        $rowEvento = $this->createRow();
        if ($rowEvento) {
            // Update the row values
            $rowEvento->evIdent = $ident;
            $rowEvento->evTitolo = $titolo;
            $rowEvento->evDataInizio = $dataInizio;
            $rowEvento->evDataFine = $dataFine;
            $rowEvento->evDataRimandato = $dataRimandato;
            $rowEvento->evDataTermine = $dataTermine;
            $rowEvento->evIntro = $intro;
            $rowEvento->evCorpo = $corpo;
            $rowEvento->evLogistica = $logistica;
            $rowEvento->evAbbigliamento = $abbigliamento;
            $rowEvento->evCosto = $costo;
            $rowEvento->evInfo = $info;
            $rowEvento->evVideo = $video;
            $rowEvento->guida_guidaId = $guidaId;
            $rowEvento->difficolta_diffId = $difficoltaId;
            $rowEvento->save();
            
            //return the new evento
            return $rowEvento;
        } else {
            throw new Zend_Exception("Non è possibile creare l'evento!");
        }
    }
    
    public function updateEvento($id, $titolo, $dataInizio, $dataFine, $dataTermine,
            $intro, $corpo, $guidaId, $difficoltaId,
            $dataRimandato = null, $logistica = null, $abbigliamento = null, 
            $costo = null, $info = null, $video = null)
    {
        //***Trim $titolo***
        $filterTrim = new Zend_Filter_StringTrim();
        $titoloTrimmed = $filterTrim->filter($titolo);
        // toLower $titolo
        $filterToLower = new Zend_Filter_StringToLower();
        $titoloMinuscolo = $filterToLower->filter($titoloTrimmed);
        // spaceToDash $titolo
        $filterSpaceToDash = new Zend_Filter_PregReplace(array(
                                            'match' => '/ /',
                                            'replace' => '-'
                                ));
        $ident = $filterSpaceToDash->filter($titoloMinuscolo);
        //***Fine Trim $titolo***
        
        $rowEvento = $this->find($id)->current();
        if ($rowEvento) {
            // Update the row values
            $rowEvento->evIdent = $ident;
            $rowEvento->evTitolo = $titolo;
            $rowEvento->evDataInizio = $dataInizio;
            $rowEvento->evDataFine = $dataFine;
            $rowEvento->evDataRimandato = $dataRimandato;
            $rowEvento->evDataTermine = $dataTermine;
            $rowEvento->evIntro = $intro;
            $rowEvento->evCorpo = $corpo;
            $rowEvento->evLogistica = $logistica;
            $rowEvento->evAbbigliamento = $abbigliamento;
            $rowEvento->evCosto = $costo;
            $rowEvento->evInfo = $info;
            $rowEvento->evVideo = $video;
            $rowEvento->guida_guidaId = $guidaId;
            $rowEvento->difficolta_diffId = $difficoltaId;
            $rowEvento->save();
            
            //return the new evento
            return $rowEvento;
        } else {
            throw new Zend_Exception("Non è possibile modificare l'evento!");
        }
    }
    
    public function deleteEvento($ident)
    {
        $rowEvento = $this->getEventoByIdent($ident);
        if ($rowEvento) {
            $rowEvento->delete();
        } else {
            throw new Zend_Exception("L'evento non esiste");
        }
    }
    
}

